从这一章开始我们将进入分析部分,这部分我们将用 Sparrow 去可视化数据,去解决下面提出的问题:
- 揭露中世纪是一个压抑的时代。(展现时代和哲学家数量的相关性和异常值)。
- 证明哲学家谈论的都是一些永恒的问题。(展现哲学家观点的特征)。
- 哲学家,哲学问题和流派的数量关系是怎样的?(展现哲学家,哲学问题和流派的数量的特征)。
- 哲学问题,哲学家和流派的数量随着时间是如何变化的?(探索哲学问题,哲学家,流派的数量的趋势,以及它们和时间的依赖关系)。
- 有多少哲学家的寿命超过了40岁,其中年龄最大和最小分别是多少?(探索哲学家寿命的分布和极值)。
- 每个哲学家回答了哪些问题?每个问题有哪些哲学家回答了?哲学家和问题之间的关系又如何?(探索哲学家和问题——网络数据之间的拓扑结构)。
- 每个流派有哪些哲学家?哪个流派的哲学家比较多?哪个比较少?(探索哲学家和流派——网络数据之间的拓扑结构)。
- 哲学的中心是怎么变化的的?(哲学家聚集地点——几何数据的形状)。
一般来说,在真正设计我们的可视化之前,我们大概看一下数据,然后再确定可视化设计。了解数据最基础的手段就是通过表格,那么这一章我们就用表格先去了解一下 philosophers.json 这份数据。
# Sparrow
首先我们用我们的 Sparrow 去绘制表格,这里的思路就是用 Text 几何元素去绘制。具体的代码和效果如下:
(async () => {
// 获得数据
const response = await fetch(
"https://gw.alipayobjects.com/os/bmw-prod/d345d2d7-a35d-4d27-af92-4982b3e6b213.json"
);
const data = await response.json();
// 行头
const keys = ["id", "name", "country", "lifespan", "points"];
return sp.plot({
data,
type: "layer",
transforms: [
(data) => data.filter((_, i) => i < 10),
// 预处理数据
(data) =>
data.map(({ lifespan, points, ...rest }) => ({
...rest,
lifespan: `[${lifespan[0]}, ${lifespan[1]}]`,
points: `[${points
.slice(0, 2)
.map((d) => d.slice(0, 2) + "...")
.join(", ")}]`,
})),
// 转换成一系列文本
(data) => {
const ths = ["index", ...keys].map((key) => ({
index: -1,
key,
value: key,
header: true,
}));
const tds = data.flatMap((d, i) => {
const cell = keys.map((key) => ({ index: i, key, 